package com.example.hadoop.mapreduce.wordcount;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 *
 * @Auther: Brian
 * @Date: 2020/04/21/8:59
 * @Description: 单词统计Demo
 * KEYIN: 默认情况下，是mr框架所读到的一行文本的起始偏移量，Long,
 * 但是在hadoop中有自己的更精简的序列化接口，所以不直接用Long，而用LongWritable
 * VALUEIN:默认情况下，是mr框架所读到的一行文本的内容，String，同上，用Text
 *
 * KEYOUT: 用户自定义处理后输出结果的key值，本Demo处理的结果是<单词，数量> --> 所以KEY是单词，类型为TEXT
 * VALUEOUT: 用户自定义处理后输出结果的value值，本Demo处理的结果是<单词，数量> --> 所以VALUE是数字，类型为IntWritable
 */
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    /**
     * map 阶段的业务逻辑就是写在重写的map方法中
     * maptask 会对每一行读取到数据都调用一次map方法
     * @param key
     * @param value
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        /**
         * 1. 将maptask传入的文本内容转换成String
         * 2. 将String 分割成单词
         * 3. 将输出结果写到context中
         */

        String line = value.toString();
        String[] words = line.split(" ");
        //此处输入的是<单词，1>
        for (String word : words) {
            //将单词作为key，数量作为1，以便于后续的数据分发
            //根据单词分发，以便于相同单词会到相同的reduce task
             context.write(new Text(word), new IntWritable(1));
        }
    }
}
